package com.cogent.menu.util;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;

import com.cogent.common.io.FileUtil;
import com.cogent.common.util.Globals;
import com.cogent.common.util.XmlUtil;
import com.cogent.menu.domain.MenuDomain;

/**
 * 解析主菜单文件。</br>
 * 对主菜单配置信息解析(mainmenu.xml)，利用dom4j对xml操作进行封装。
 * @author daiys 
 * @version 1.0<br/>
 * ****************************************************<br/>
 * 版本号	 修改日期		作者			更改原因<br/>
 * 1.0		2009-11-27	daiys		新增<br/>
 * ****************************************************<br/>
 */
public class MainMeunParse {
	
	/**
	 * 主菜单文件默认路径
	 */
	public static String MAINMENU_FILE = Globals.getRootPath() + "WEB-INF/config/mainmenu.xml";
	
	/**
	 * 设置主菜单路径
	 * @param fileName 主菜单路径
	 */
	public static void setMainMenuFile(String fileName) {
		MAINMENU_FILE = fileName;
	}
	
	/**
	 * 解析主菜单桌面配置属性.<br/>
	 * 解析main_desktop节点
	 * @return
	 */
	public String parseMainDesktop() {
		Document doc = XmlUtil.loadXmlFormFile(MAINMENU_FILE);
		Node node = doc.selectSingleNode("//root");
		return XmlUtil.getNodeValue(node, "main_desktop");
	}
	
	/**
	 * 解析菜单配置文件.<br/>
	 * 解析menus节点.
	 * @return
	 */
	public List<String> parseMenus() {
		List<String> list = new ArrayList<String>();
		list.add(MAINMENU_FILE);
		File f = new File(MAINMENU_FILE);
		String path = getPath(f.getAbsolutePath(), f.getName());
		Document doc = XmlUtil.loadXmlFormFile(MAINMENU_FILE);
		List<?> nodeList = doc.selectNodes("//root/menus");
		Iterator<?> it = nodeList.iterator();
		while(it.hasNext()) {
			Element e = (Element)it.next();
			String tempPath = path + FileUtil.getFileSeparator()
				+ XmlUtil.getAttributeValue(e, "src");
			list.add(tempPath);
		}
		
		return list;
	}
	
	/**
	 * 解析菜单配置信息
	 * @return List
	 */
	public List<MenuDomain> parseAll() {
		List<MenuDomain> retList = new ArrayList<MenuDomain>();
		List<String> menuList = parseMenus();
		Iterator<?> it = menuList.iterator();
		while(it.hasNext()) {
			Document doc = XmlUtil.loadXmlFormFile(it.next().toString());
			Element el = (Element)doc.selectSingleNode("//root/modules");
			if(el != null) {
				for(int i=0; i<el.nodeCount(); i++) {
					Node n = el.node(i);
					getInnerNode(n, retList, null);
				}
			}
		}
		
		return retList;
	}	
	
	/**
	 * 获取根路径
	 * @param absolutePath 绝对路径
	 * @param name 文件名
	 * @return
	 */
	private String getPath(String absolutePath, String name) {
		return absolutePath.substring(0, absolutePath.length()-name.length()-1);
	}
	
	/**
	 * 解析菜单属性节点.<br/>
	 * 递归解析
	 * @param n 当前节点
	 * @param list 属性对象集合
	 * @param parentMenu 父节点
	 */
	private void getInnerNode(Node n, List<MenuDomain> list, MenuDomain parentMenu) {
		if(n instanceof Element) {
			MenuDomain menuDomain = new MenuDomain();
			Element el = (Element) n;
			XmlUtil.attributeToBean(el, menuDomain);
			menuDomain.setParentMenuDomain(parentMenu);
			list.add(menuDomain);
			int count = el.nodeCount();
			for(int i=0; i<count; i++)
				getInnerNode(el.node(i), list, menuDomain);
		}
	}
	
	public static void main(String[] args) {
		MainMeunParse mm = new MainMeunParse();
		
		List list = mm.parseAll();
		
		System.out.println(list.size());
	}
}
